1 module hunt.templates.util; 2 3 import hunt.templates.element; 4 import hunt.templates.rule; 5 import std.stdio; 6 import std.regex; 7 8 class Util 9 { 10 static int level = 1; 11 public: 12 static void debug_ast(Element e) 13 { 14 level++; 15 switch (e.type) 16 { 17 case Type.Comment: 18 { 19 auto elm = cast(ElementComment)(e); 20 printSpace(level); 21 writeln("Type : Comment, text : ", elm.text); 22 break; 23 } 24 case Type.Condition: 25 { 26 auto elm = cast(ElementConditionContainer)(e); 27 printSpace(level); 28 writeln("Type : Condition "); 29 printSpace(level); 30 writeln(" +++++++children begin "); 31 foreach (child; elm.children) 32 { 33 debug_ast(child); 34 } 35 printSpace(level); 36 writeln(" +++++++children end "); 37 break; 38 } 39 case Type.ConditionBranch: 40 { 41 auto elm = cast(ElementConditionBranch)(e); 42 printSpace(level); 43 writeln("Type : ConditionBranch, condition_type : ", elm.condition_type); 44 printSpace(level); 45 writeln(" ElementExpression begin "); 46 debug_ast(elm.condition); 47 printSpace(level); 48 writeln(" ElementExpression end "); 49 printSpace(level); 50 writeln(" +++++++children begin "); 51 foreach (child; elm.children) 52 { 53 debug_ast(child); 54 } 55 printSpace(level); 56 writeln(" +++++++children end "); 57 break; 58 } 59 case Type.Expression: 60 { 61 auto elm = cast(ElementExpression)(e); 62 printSpace(level); 63 writeln("Type : Expression, Function : ", elm.func, 64 ", command :", elm.command, ", result :", elm.result.toString); 65 printSpace(level); 66 writeln(" =====args begin====="); 67 foreach (child; elm.args) 68 { 69 debug_ast(child); 70 } 71 printSpace(level); 72 writeln(" =====args end======="); 73 printSpace(level); 74 writeln(" +++++++children begin "); 75 foreach (child; elm.children) 76 { 77 debug_ast(child); 78 } 79 printSpace(level); 80 writeln(" +++++++children end "); 81 break; 82 } 83 case Type.Loop: 84 { 85 auto elm = cast(ElementLoop)(e); 86 printSpace(level); 87 writeln("Type : Loop, Loop : ", elm.loop, " key:", elm.key, 88 " value: ", elm.value); 89 printSpace(level); 90 writeln(" ElementExpression begin "); 91 debug_ast(elm.list); 92 printSpace(level); 93 writeln(" ElementExpression end "); 94 printSpace(level); 95 writeln(" +++++++children begin "); 96 foreach (child; elm.children) 97 { 98 debug_ast(child); 99 } 100 printSpace(level); 101 writeln(" +++++++children end "); 102 break; 103 } 104 case Type.Main: 105 { 106 printSpace(level); 107 writeln("----------AST TREE DEBUG-----------"); 108 foreach (child; e.children) 109 { 110 debug_ast(child); 111 } 112 break; 113 } 114 case Type.String: 115 { 116 auto elm = cast(ElementString)(e); 117 printSpace(level); 118 writeln("Type : String, text : ", elm.text); 119 break; 120 } 121 default: 122 { 123 break; 124 } 125 } 126 127 level--; 128 } 129 130 static printSpace(int num) 131 { 132 for (size_t i = 0; i < num; i++) 133 write(" "); 134 } 135 136 static bool is_num(string str) 137 { 138 auto m = match(str, regex(`^[0-9]\d*$`)); 139 return !m.empty; 140 } 141 }